package com.goldenKey.common.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.auth0.jwt.interfaces.JWTVerifier;
import com.goldenKey.common.constant.Constant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * JWT令牌
 */
@Component
public class JwtUtils {
    private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class);

    // 设置jwt令牌的密钥，自定义
    public static final String SECRET = "chiWoYiZhao";
    
    /**
     * 生成Token
     * @param id
     * @param account
     * @return
     */
    public static String createToken(String id, String account) {
        String token = null;
        try {
            // 设置token有效时间为 1天
            Date expirationTime = new Date(System.currentTimeMillis() + Constant.KEY_SURVIVAL_ONE_DAY);
            Algorithm algorithm = Algorithm.HMAC256(SECRET);  //调用Algorithm的HMAC256()方法，将密钥通过该算法加密

            Map<String, Object> map = new HashMap<>();
            map.put("Type", "jwt");
            map.put("alg", "HS256");
            token = JWT.create()
                    .withHeader(map)
                    .withClaim("id", id)
                    .withClaim("account", account)
                    .withExpiresAt(expirationTime)
                    .sign(algorithm);
        } catch (Exception e) {
            logger.error("生成token失败：{}", e.getMessage(), e);
            return null;
        }
        return token;
    }



    /**
     * 验证Token
     * @param token
     * @return
     */
    public static boolean verifyToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET); //调用Algorithm的HMAC256()方法，将密钥通过该算法加密
            JWTVerifier verifier = JWT.require(algorithm).build(); //验证密钥是否正确
            DecodedJWT jwt = verifier.verify(token);  //验证jwt令牌是否正确
            return true;
        } catch (Exception e) {
            logger.error("token验证为不合法：{}", e.getMessage(), e);
            return false;
        }
    }

    /**
     * 通过token获取用户id
     * @param token
     * @return
     */
    public static String getUserIdFromToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET); // 使用密钥和 HMAC256 算法
            JWTVerifier verifier = JWT.require(algorithm).build(); // 验证 JWT
            DecodedJWT jwt = verifier.verify(token); // 验证 JWT

            // 从 Claims 中获取 "userId" 并返回
            Claim userIdClaim = jwt.getClaim("userId");
            return userIdClaim.asString(); // 返回用户 ID（假设是 String 类型）
        } catch (Exception e) {
            logger.error("解析 token 获取用户 ID 失败：{}", e.getMessage(), e);
            return null;
        }
    }

    /**
     * 通过token获取管理员账号
     * @param token
     * @return
     */
    public static String getAdminAccountFromToken(String token) {
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET); // 使用密钥和 HMAC256 算法
            JWTVerifier verifier = JWT.require(algorithm).build(); // 验证 JWT
            DecodedJWT jwt = verifier.verify(token); // 验证 JWT

            // 从 Claims 中获取 "account" 并返回
            Claim accountClaim = jwt.getClaim("adminAccount");
            return accountClaim.asString(); // 返回管理员账号（假设是 String 类型）
        } catch (Exception e) {
            logger.error("解析 token 获取管理员账号失败：{}", e.getMessage(), e);
            return null;
        }
    }


    /**
     * 解析Token,获取jwt令牌中存储的信息
     * @param token
     * @return
     */
    public static Map<String, Claim> parseToken(String token){
        try {
            Algorithm algorithm = Algorithm.HMAC256(SECRET); //调用Algorithm的HMAC256()方法，将密钥通过该算法加密
            JWTVerifier verifier = JWT.require(algorithm).build(); //验证密钥是否正确
            DecodedJWT jwt = verifier.verify(token);     //验证jwt令牌是否正确
            return jwt.getClaims();
        } catch (Exception e) {
            logger.error("token解析失败：{}", e.getMessage(), e);
            return null;
        }
    }

    public static void main(String[] args) {

    }
}

